PGMS_150369_택배 배달과 수거하기

포인터를 옮겨가며 택배를 배달하고 수거하는 문제
배달 / 수거 중에 더 긴 쪽 * 2를 정답에 더하면서 푼다

stack으로 구현할까? 생각했는데 집들 다 추가해주면 너무 커질 거 같아서 그냥 포인터로 했다
시간복잡도는 포인터 세팅(n) + delivery visit(n) + pickup visit(n) = O(3n) = O(n)

class Solution {
    static int capCnt;
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        // 어차피 오고 가는 거리는 동일하다
        // 뒷 집부터 배달하기
        // 포인터를 줘서 다음 방문해야 할 집을 표시해두자
        capCnt = cap;
        
        int pickUpPointer = -1;
        int deliveryPointer = -1;
        boolean flagP = false;
        boolean flagD = false;
        
        // 포인터 세팅
        for(int i = n - 1; i >= 0; i --) {
            if(!flagD && deliveries[i] > 0) {
                flagD = true;
                deliveryPointer = i;
            }
            
            if(!flagP && pickups[i] > 0) {
                flagP = true;
                pickUpPointer = i;
            }
            
            if(flagD && flagP) {
                break;
            }
        }

        long answer = 0;
        
        while(true) {
            if(deliveryPointer == -1 && pickUpPointer == -1) {
                break;
            }
            
            answer += Math.max(deliveryPointer + 1, pickUpPointer + 1) * 2;
            
            deliveryPointer = visit(deliveries, deliveryPointer);
            pickUpPointer = visit(pickups, pickUpPointer);
        }
        
        return answer;
    }
    
    static int visit(int[] arr, int pointer) {
        int cnt = capCnt;
        while(pointer >= 0) {
            if(arr[pointer] > 0 && cnt > 0) {
                if(cnt >= arr[pointer]) {
                    cnt -= arr[pointer];
                    arr[pointer] = 0;
                    pointer --;
                } else {
                    arr[pointer] -= cnt;
                    cnt = 0;
                }
            }
            
            else if(arr[pointer] > 0 && cnt == 0) {
                break;
            }

            else {
                pointer --;
            }
        }
        
        return pointer;
    }
}